package com.joker.demo.core.util;

import com.joker.demo.core.constant.JobStatusConstants;
import com.joker.demo.core.domain.enums.JobStatusEnum;

import java.util.Arrays;

/**
 * 任务状态工具类
 * 提供任务状态判断和转换的便捷方法
 *
 * @author : feixiang.li
 * @since : 2025-01-27 10:00
 */
public class JobStatusUtils {

    /**
     * 检查状态码是否为可执行状态
     *
     * @param statusCode 状态码
     * @return true表示可以执行，false表示不能执行
     */
    public static boolean isExecutable(Integer statusCode) {
        if (statusCode == null) {
            return false;
        }
        return statusCode.equals(JobStatusConstants.Status.READY);
    }

    /**
     * 检查状态码是否为异常状态
     *
     * @param statusCode 状态码
     * @return true表示异常状态，false表示正常状态
     */
    public static boolean isException(Integer statusCode) {
        if (statusCode == null) {
            return false;
        }
        return statusCode.equals(JobStatusConstants.Status.EXCEPTION);
    }

    /**
     * 检查状态码是否为停止状态
     *
     * @param statusCode 状态码
     * @return true表示停止状态，false表示运行状态
     */
    public static boolean isStopped(Integer statusCode) {
        if (statusCode == null) {
            return false;
        }
        return Arrays.stream(JobStatusConstants.StatusGroup.STOPPED)
                .anyMatch(status -> status == statusCode);
    }

    /**
     * 检查状态码是否为活跃状态
     *
     * @param statusCode 状态码
     * @return true表示活跃状态，false表示非活跃状态
     */
    public static boolean isActive(Integer statusCode) {
        if (statusCode == null) {
            return false;
        }
        return Arrays.stream(JobStatusConstants.StatusGroup.ACTIVE)
                .anyMatch(status -> status == statusCode);
    }

    /**
     * 检查状态码是否为非活跃状态
     *
     * @param statusCode 状态码
     * @return true表示非活跃状态，false表示活跃状态
     */
    public static boolean isInactive(Integer statusCode) {
        if (statusCode == null) {
            return true;
        }
        return Arrays.stream(JobStatusConstants.StatusGroup.INACTIVE)
                .anyMatch(status -> status == statusCode);
    }

    /**
     * 根据状态码获取状态描述
     *
     * @param statusCode 状态码
     * @return 状态描述，如果状态码无效则返回"未知状态"
     */
    public static String getStatusDesc(Integer statusCode) {
        if (statusCode == null) {
            return "未知状态";
        }
        
        JobStatusEnum statusEnum = JobStatusEnum.getByCode(statusCode);
        return statusEnum != null ? statusEnum.getDesc() : "未知状态";
    }

    /**
     * 根据状态码获取状态枚举
     *
     * @param statusCode 状态码
     * @return 状态枚举，如果状态码无效则返回null
     */
    public static JobStatusEnum getStatusEnum(Integer statusCode) {
        return JobStatusEnum.getByCode(statusCode);
    }

    /**
     * 根据状态描述获取状态码
     *
     * @param statusDesc 状态描述
     * @return 状态码，如果状态描述无效则返回null
     */
    public static Integer getStatusCode(String statusDesc) {
        if (statusDesc == null) {
            return null;
        }
        
        JobStatusEnum statusEnum = JobStatusEnum.getByDesc(statusDesc);
        return statusEnum != null ? statusEnum.getCode() : null;
    }

    /**
     * 检查状态码是否有效
     *
     * @param statusCode 状态码
     * @return true表示有效，false表示无效
     */
    public static boolean isValidStatus(Integer statusCode) {
        return JobStatusEnum.getByCode(statusCode) != null;
    }

    /**
     * 获取所有有效的状态码
     *
     * @return 所有有效的状态码数组
     */
    public static Integer[] getAllValidStatusCodes() {
        JobStatusEnum[] values = JobStatusEnum.values();
        Integer[] codes = new Integer[values.length];
        for (int i = 0; i < values.length; i++) {
            codes[i] = values[i].getCode();
        }
        return codes;
    }

    /**
     * 获取所有状态描述
     *
     * @return 所有状态描述数组
     */
    public static String[] getAllStatusDescs() {
        JobStatusEnum[] values = JobStatusEnum.values();
        String[] descs = new String[values.length];
        for (int i = 0; i < values.length; i++) {
            descs[i] = values[i].getDesc();
        }
        return descs;
    }

    /**
     * 私有构造函数，防止实例化
     */
    private JobStatusUtils() {
        throw new UnsupportedOperationException("工具类不能实例化");
    }
}
